www.gusucode.com > VC++ 仿SQLServer企业管理器的SQL客户端工具-源码程序 > VC++ 仿SQLServer企业管理器的SQL客户端工具-源码程序/code/eiTab.cpp
#include "stdafx.h" #include "sql.h" #include "sqlext.h" #include "FTDB.h" #include "eiTab.h" #include "outputCon.h" // Download by http://www.NewXing.com CExpTab::CExpTab(CFTDB* pDB) { m_pDB=pDB; m_fMonitorConsole=TRUE; m_pFileData2=m_pFileData=m_pFile=NULL; m_fWithTxtFile=FALSE; m_fWithHeader=TRUE; } CExpTab::~CExpTab() { } BOOL CExpTab::ExportTab(LPCSTR pszExpSQL,LPCSTR pszFileName,LPCSTR pszImpSQL) { HSTMT hstmt; RETCODE rt=SQLAllocStmt(m_pDB->m_hdbc,&hstmt); if(!SQL_SUCC(rt)) return FALSE; SQLSetStmtOption(hstmt,SQL_CONCURRENCY,SQL_CONCUR_READ_ONLY); SQLSetStmtOption(hstmt,SQL_CURSOR_TYPE,SQL_CURSOR_FORWARD_ONLY); BOOL fOK=FALSE; if(m_fMonitorConsole) startConsoleWin(); if(OpenFile(pszFileName,m_fWithTxtFile)) { WriteFileHead(pszExpSQL,pszImpSQL); fOK=ExportTab_2(hstmt,pszExpSQL); CloseFile(); } if(m_fMonitorConsole) endConsoleWin(); SQLFreeStmt(hstmt,SQL_DROP); return fOK; } BOOL CExpTab::ExportTab_2(HSTMT hstmt,LPCSTR pszSQL) {//第二步 RETCODE rt=SQLExecDirect(hstmt,(UCHAR*)pszSQL, SQL_NTS); if(!SQL_SUCCEEDED(rt)) { m_pDB->DisplayError(hstmt); return FALSE; } SWORD swNum; rt=SQLNumResultCols(hstmt,&swNum); if(!SQL_SUCCEEDED(rt)) return FALSE; SDWORD cbLen=1024*50; char *pszBuf=new char[cbLen]; sprintf(pszBuf,"%d",(int)swNum); WriteFile("<Col>"); WriteFile(pszBuf); WriteFile("</Col>"); int iRecordNum=0; while(1) { rt= SQLFetch(hstmt); if(!SQL_SUCCEEDED(rt)) { delete pszBuf; if(SQL_NO_DATA_FOUND==rt) { if(m_fMonitorConsole) debugCon_wprintf("完成\n"); char szOut[100]; sprintf(szOut,"%d",iRecordNum); WriteFile("<Record>"); WriteFile(szOut); WriteFile("</Record>"); if(m_fMonitorConsole) debugCon_wprintf("成功导出数据 %d 条",iRecordNum); //AfxMessageBox(szOut); break; } else { if(m_fMonitorConsole) debugCon_wprintf("出现错误\n",iRecordNum); m_pDB->DisplayError(hstmt); return FALSE; } } iRecordNum++; if(m_fMonitorConsole) debugCon_wprintf("导出第 %d 条记录\n",iRecordNum); for(int i=0;i<(int)swNum;i++) { SDWORD cbRetLen; rt=SQLGetData(hstmt,i+1, SQL_C_CHAR, pszBuf, cbLen,&cbRetLen); if(!SQL_SUCCEEDED(rt)) { if(m_fMonitorConsole) debugCon_wprintf("出现错误\n"); m_pDB->DisplayError(hstmt); delete pszBuf; return FALSE; } WriteFile(pszBuf,(DWORD)cbRetLen); } } return TRUE; } BOOL CExpTab::WriteFileHead(LPCSTR pszExpSQL,LPCSTR pszImpSQL) { if(m_pFile) { WriteFile("<<HG DB FrontTool 0.1>>"); WriteFile("<Exp>"); WriteFile(pszExpSQL); WriteFile("</Exp>"); WriteFile("<Imp>"); WriteFile(pszImpSQL); WriteFile("</Imp>"); WriteFile("<<Head End>>"); } return TRUE; } BOOL CExpTab::WriteFile(LPCSTR pszTxt) { if(m_pFile) fprintf(m_pFile,"%s\n",pszTxt); return TRUE; } BOOL CExpTab::WriteFile(LPVOID pData,DWORD dwLen) { DWORD dwW=fwrite(&dwLen,sizeof(DWORD),1,m_pFileData); if(dwLen!=(DWORD)-1) dwW+=fwrite(pData,dwLen,1,m_pFileData); if(NULL==m_pFileData2) return dwW==dwLen; char szTxt[20]; sprintf(szTxt,"%d",dwLen); fprintf(m_pFileData2,"%s->",szTxt); for(int i=0;i<(int)dwLen;i++) { fprintf(m_pFileData2,"%c",((char*)pData)[i]); } fprintf(m_pFileData2,"\n"); return dwW==dwLen; } BOOL CExpTab::OpenFile(LPCSTR pszFN,BOOL fWithTxt) { char szFN[300]; sprintf(szFN,"%s.hdr",pszFN); ASSERT(m_fWithHeader); if(m_fWithHeader) m_pFile=fopen(szFN,"wt"); else m_pFile=NULL; sprintf(szFN,"%s.exp",pszFN); m_pFileData=fopen(szFN,"wb"); sprintf(szFN,"%s.txt",pszFN); if(fWithTxt) m_pFileData2=fopen(szFN,"wb"); else m_pFileData2=NULL; if(!m_pFile || !m_pFileData) { CloseFile(); return FALSE; } return TRUE; } BOOL CExpTab::CloseFile(void) { if(m_pFile) fclose(m_pFile); if(m_pFileData) fclose(m_pFileData); if(m_pFileData2) fclose(m_pFileData2); return TRUE; } CImpTab::CImpTab(CFTDB* pDB) { m_pDB=pDB; m_fMonitorConsole=TRUE; m_pFileData=m_pFile=NULL; } CImpTab::~CImpTab() { } BOOL GetMiddleString(FILE* pF,LPCSTR pszH,LPCSTR pszT,CString &szBuf) { char szRead[400]; szBuf=""; CString szTemp; int iPhase=0; while(NULL!=fgets(szRead,399,pF)) { szTemp=szRead; switch(iPhase) { case(0): if(0==szTemp.Find(pszH)) iPhase=1; break; case(1): if(0==szTemp.Find(pszT)) { return TRUE; } szBuf+=szRead; szBuf+="\n"; break; default: ASSERT(0); break; } } return FALSE; } BOOL CImpTab::AnalyHeader(LPCSTR pszFileName,int &iCol,int &iRow,CString& szImpSQL) { FILE* pFile=fopen(pszFileName,"r"); if(NULL==pFile) return FALSE; BOOL fOK1,fOK2,fOK3; CString szContent; fOK1=GetMiddleString(pFile,"<Imp>","</Imp>",szContent); szImpSQL=szContent; fOK2=GetMiddleString(pFile,"<Col>","</Col>",szContent); iCol=atoi(szContent); fOK3=GetMiddleString(pFile,"<Record>","</Record>",szContent); iRow=atoi(szContent); return fOK1&&fOK2&&fOK3; } BOOL CImpTab::ImportTab(LPCSTR pszSQL,LPCSTR pszFileName,int iCol,int iTotal) { m_iCol=iCol; m_iTotalRecord=iTotal; // if(m_iCol==-1 || m_iTotal==-1) // ReadFileHead(); HSTMT hstmt; RETCODE rt=SQLAllocStmt(m_pDB->m_hdbc,&hstmt); if(!SQL_SUCC(rt)) return FALSE; BOOL fOK=FALSE; NewBuf(); if(m_fMonitorConsole) startConsoleWin(); if(OpenFile(pszFileName)) { fOK=ImportTab_2(hstmt,pszSQL); CloseFile(); } if(m_fMonitorConsole) endConsoleWin(); SQLFreeStmt(hstmt,SQL_DROP); DelBuf(); return fOK; } BOOL CImpTab::ImportTab_2(HSTMT hstmt,LPCSTR pszSQL) { RETCODE rt = SQLPrepare(hstmt, (UCHAR*)pszSQL,SQL_NTS); if (rt != SQL_SUCCESS) { m_pDB->DisplayError(hstmt); return FALSE; } SDWORD cbLen=SQL_NTS; for(int i=0;i<m_iCol;i++) {//添加参数 char* pszBuf=(char*)m_arrPtrBuf.GetAt(i); rt=SQLBindParameter(hstmt, i+1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 1024*4, 0, pszBuf, 0, &cbLen); if(!SQL_SUCC(rt)) { if(m_fMonitorConsole) debugCon_wprintf("出现错误\n"); m_pDB->DisplayError(hstmt); return FALSE; } } for(i=0;i<m_iTotalRecord;i++) { if(m_fMonitorConsole) debugCon_wprintf("导入数据第%d条\n",i+1); ReadRecord(); rt= SQLExecute(hstmt); if(!SQL_SUCC(rt)) { if(m_fMonitorConsole) debugCon_wprintf("出现错误\n"); m_pDB->DisplayError(hstmt); return FALSE; } } if(m_fMonitorConsole) debugCon_wprintf("完成\n"); return TRUE; } BOOL CImpTab::ReadFileHead(void) { return FALSE; } BOOL CImpTab::ReadRecord(void) { DWORD dwLen,dwRead; for(int i=0;i<m_iCol;i++) { char* pszBuf=(char*)m_arrPtrBuf.GetAt(i); dwRead=fread(&dwLen,sizeof(DWORD),1,m_pFileData); if(dwLen!=(DWORD)-1) dwRead+=fread(pszBuf,dwLen,1,m_pFileData); else dwLen=0; pszBuf[dwLen]='\0'; } return (dwRead==dwLen+sizeof(DWORD)); } BOOL CImpTab::NewBuf(void) { for(int i=0;i<m_iCol;i++) {//bug char* pBuf=new char[1024*4]; m_arrPtrBuf.Add(pBuf); } return TRUE; } BOOL CImpTab::DelBuf(void) { for(int i=0;i<m_iCol;i++) { void* pBuf=m_arrPtrBuf.GetAt(0); m_arrPtrBuf.RemoveAt(0); delete pBuf; } return TRUE; } BOOL CImpTab::OpenFile(LPCSTR pszFileName) { char szFN[300]; sprintf(szFN,"%s.hdr",pszFileName); m_pFile=fopen(szFN,"rt"); sprintf(szFN,"%s.exp",pszFileName); m_pFileData=fopen(szFN,"rb"); if(!m_pFile || !m_pFileData) { CloseFile(); return FALSE; } return TRUE; } BOOL CImpTab::CloseFile(void) { if(m_pFile) fclose(m_pFile); if(m_pFileData) fclose(m_pFileData); return TRUE; }